【新機能】Amazon RDSのMySQLとMariaDBで監査ログに対応。ついでにrdsadminの動作も確認してみた。

【新機能】Amazon RDSのMySQLとMariaDBで監査ログに対応。ついでにrdsadminの動作も確認してみた。

Clock Icon2016.05.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。

先日RDSでMySQLとMariaDBで監査ログに対応したので、ご紹介します。

MariaDB audit plug-in now available for RDS MySQL and MariaDB

DBの監査

RDSの各DBエンジンでは、以下の表のように監査機能をサポートしています。今回はMySQLとMariaDBでMariaDB社が開発しているMariaDB Audit Pluginに対応しました。

DBエンジン 監査機能 備考
Aurora 無し。
MySQL ○ (new!) MariaDB Audit Pluginをサポート。
5.6.29以降と5.7.11以降で使用可能です。
MariaDB ○ (new!) MariaDB Audit Pluginをサポート。
PostgreSQL log_statementの内容。pg_auditは未サポート。
Oracle DBA監査やファイングレイン監査をサポート。
SQL Server SQL Server Auditは未サポート。

MariaDB Audit Pluginを設定してみる

今回はMySQL 5.7.11を使用します。補足ですが、5.7.11はdefault_password_lifetimeのデフォルト値が0になっているリバージョンです。

オプショングループの作成

MariaDB Audit Pluginの設定はオプショングループで行うため、まずオプショングループを作成します。オプショングループの画面でグループの作成をクリックします。
事前に作成されているdefault:で始まるオプショングループは内容を変更できないため、別途作成して下さい。

RDS_·_AWS_Console

今回はMySQL 5.7.11で起動するため、MySQL 5.7を選択します。

RDS_·_AWS_Console

作成したオプショングループを編集します。
まず、オプションでMARIADB_AUDIT_PLUGINを選択すると、以下のようにMariaDB Audit Pluginの設定項目が表示されます。ここで、内容を設定します。

今回は、下表のように設定します。今回はデフォルトの状態からSERVER_AUDIT_EVENTSの設定にTABLEを追加しています。 設定内容の詳細やデフォルト値はAppendix: Options for MySQLServer_Audit System Variablesを参照して下さい。

オプション設定 備考
SERVER_AUDIT_EVENTS CONNECT,QUERY,TABLE 監査する対象のイベントです。
SERVER_AUDIT_INCL_USERS 監査対象とするユーザです。
SERVER_AUDIT_EXCL_USERS 監査対象外とするユーザです。
SERVER_AUDIT_FILE_ROTATE_SIZE ログファイルがローテーションするサイズ制限です。
SERVER_AUDIT_FILE_ROTATIONS 保存する世代数数です。
SERVER_AUDIT_LOGGING ON ログが有効化を決めます。変更不能。
SERVER_AUDIT_FILE_PATH /rdsdbdata/log/audit/ ログファイルの場所です。変更不能。
SERVER_AUDIT FORCE_PLUS_PERMANENT この設定はセキュリティのために有効になっており、プラグイン実行時にアンインストールができないことを保証しています。変更不能。

MariaDB Audit Plugin 1.2.0からはserver_audit_eventsに設定できる値としてQUERY_DDLQUERY_DMLが追加されていますが、RDSでは使用できないようです。

RDS_·_AWS_Console

RDS for MySQLの起動

ここでは、DBエンジンのバージョンで5.7.11を選択します。
なお、2016年5月2日現在では、コンソールのデフォルト値が「5.6.27」なのでMariaDB Audit Pluginが使用できないバージョンです。ご注意下さい。

RDS_·_AWS_Console

オプショングループで、先ほど作成した物を設定します。

RDS_·_AWS_Console

監査ログを試す

MySQLにログインして内容を確認します。

まずPluginを確認しましょう。server_audit.soがインストールされていることが確認できます。

mysql> show plugins;
+----------------------------+----------+--------------------+-----------------+---------+
| Name                       | Status   | Type               | Library         | License |
+----------------------------+----------+--------------------+-----------------+---------+
(中略)
| SERVER_AUDIT               | ACTIVE   | AUDIT              | server_audit.so | GPL     |
+----------------------------+----------+--------------------+-----------------+---------+
46 rows in set (0.01 sec)

次にMariaDB Audit Pluginのシステム変数を確認します。server_audit_loc_infoはドキュメントにも記載がないため不明です。

mysql> SHOW GLOBAL VARIABLES LIKE 'server_audit%'\G
*************************** 1. row ***************************
Variable_name: server_audit_events
        Value: CONNECT,QUERY,TABLE
*************************** 2. row ***************************
Variable_name: server_audit_excl_users
        Value: 
*************************** 3. row ***************************
Variable_name: server_audit_file_path
        Value: /rdsdbdata/log/audit/
*************************** 4. row ***************************
Variable_name: server_audit_file_rotate_now
        Value: OFF
*************************** 5. row ***************************
Variable_name: server_audit_file_rotate_size
        Value: 1000000
*************************** 6. row ***************************
Variable_name: server_audit_file_rotations
        Value: 9
*************************** 7. row ***************************
Variable_name: server_audit_incl_users
        Value: 
*************************** 8. row ***************************
Variable_name: server_audit_loc_info
        Value: OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
*************************** 9. row ***************************
Variable_name: server_audit_logging
        Value: ON
*************************** 10. row ***************************
Variable_name: server_audit_mode
        Value: 1
*************************** 11. row ***************************
Variable_name: server_audit_output_type
        Value: file
*************************** 12. row ***************************
Variable_name: server_audit_query_log_limit
        Value: 1024
*************************** 13. row ***************************
Variable_name: server_audit_syslog_facility
        Value: LOG_USER
*************************** 14. row ***************************
Variable_name: server_audit_syslog_ident
        Value: mysql-server_auditing
*************************** 15. row ***************************
Variable_name: server_audit_syslog_info
        Value: 
*************************** 16. row ***************************
Variable_name: server_audit_syslog_priority
        Value: LOG_INFO
16 rows in set (0.00 sec)

次に一度テーブルを作成して、Selectをしてみます。

mysql> create table mydb.sample(id int, value varchar(32));
Query OK, 0 rows affected (0.02 sec)

mysql> select * from mydb.sample;
Empty set (0.00 sec)

次に監査ログを確認します。マネージメントコンソールのログの画面でaudit/server_audit.logをダウンロードします。

RDS_·_AWS_Console

ログの内容を確認する。

ログファイルでログインしたユーザの内容を確認してみます。先ほど実行したcreate文やselect文が出力されています。DDLやDMLの内容も出力されます。

$ grep awsuser ./server_audit_2.log
20160502 10:46:56,ip-10-7-0-127,awsuser,172.31.4.158,14,0,CONNECT,,,0
20160502 10:46:56,ip-10-7-0-127,awsuser,172.31.4.158,14,404,QUERY,,'select @@version_comment limit 1',0
20160502 10:47:52,ip-10-7-0-127,awsuser,172.31.4.158,14,433,QUERY,,'mysql show variables like \'server_audit_%\'',1064
20160502 10:48:01,ip-10-7-0-127,awsuser,172.31.4.158,14,444,QUERY,,'mysql show variables like \'server_audit%\'',1064
20160502 10:48:19,ip-10-7-0-127,awsuser,172.31.4.158,14,451,QUERY,,'mysql show variables like \'server_audit_events\'',1064
20160502 10:48:37,ip-10-7-0-127,awsuser,172.31.4.158,14,468,QUERY,,'show variables like \'server_audit_events\'',0
20160502 10:48:44,ip-10-7-0-127,awsuser,172.31.4.158,14,469,QUERY,,'show variables like \'server_audit_%\'',0
20160502 11:01:16,ip-10-7-0-127,awsuser,172.31.4.158,14,884,QUERY,,'show plugins',0
20160502 11:03:07,ip-10-7-0-127,awsuser,172.31.4.158,14,935,QUERY,,'show variables like \'%AUDIT%\'',0
20160502 11:06:38,ip-10-7-0-127,awsuser,172.31.4.158,14,0,DISCONNECT,,,0
20160502 11:07:38,ip-10-7-0-127,awsuser,172.31.4.158,19,0,CONNECT,mydb,,0
20160502 11:07:38,ip-10-7-0-127,awsuser,172.31.4.158,19,1083,QUERY,mydb,'show databases',0
20160502 11:07:38,ip-10-7-0-127,awsuser,172.31.4.158,19,1084,QUERY,mydb,'show tables',0
20160502 11:07:38,ip-10-7-0-127,awsuser,172.31.4.158,19,1085,QUERY,mydb,'select @@version_comment limit 1',0
20160502 11:07:50,ip-10-7-0-127,awsuser,172.31.4.158,19,1092,QUERY,mydb,'show plugins',0
20160502 11:08:01,ip-10-7-0-127,awsuser,172.31.4.158,19,1103,QUERY,mydb,'show variables like \'server_audit_%\'',0
20160502 11:18:51,ip-10-7-0-127,awsuser,172.31.4.158,19,1454,QUERY,mydb,'SHOW GLOBAL VARIABLES LIKE \'server_audit%\'',0
20160502 11:19:01,ip-10-7-0-127,awsuser,172.31.4.158,19,1465,QUERY,mydb,'SHOW GLOBAL VARIABLES LIKE \'server_audit%\'',0
20160502 11:25:08,ip-10-7-0-127,awsuser,172.31.4.158,19,1665,QUERY,mydb,'create table mydb.sample(id int, value varchar(32))',0
20160502 11:25:19,ip-10-7-0-127,awsuser,172.31.4.158,19,1672,QUERY,mydb,'select * from mydb.sample',0
20160502 11:29:09,ip-10-7-0-127,awsuser,172.31.4.158,19,0,DISCONNECT,mydb,,0
20160502 11:29:10,ip-10-7-0-127,awsuser,172.31.4.158,24,0,CONNECT,mydb,,0
20160502 11:29:10,ip-10-7-0-127,awsuser,172.31.4.158,24,1793,QUERY,mydb,'show databases',0
20160502 11:29:10,ip-10-7-0-127,awsuser,172.31.4.158,24,1794,QUERY,mydb,'show tables',0
20160502 11:29:10,ip-10-7-0-127,awsuser,172.31.4.158,24,1796,QUERY,mydb,'select @@version_comment limit 1',0
20160502 11:31:37,ip-10-7-0-127,awsuser,172.31.4.158,24,0,DISCONNECT,mydb,,0

rdsadminが実行している内容を確認する

今度はRDSの管理ユーザであるrdsadminが実行している内容を確認してみましょう。ログの先頭ではMariaDB Audit Pluginをインストールしていることろからログが開始されています。

20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,1,QUERY,,'install plugin server_audit soname "server_audit.so"',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,2,QUERY,,'SELECT 1',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,3,QUERY,,'SET GLOBAL server_audit_file_path=\'/rdsdbdata/log/audit/\'',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,3,QUERY,,'SET GLOBAL server_audit_file_path=\'/rdsdbdata/log/audit/\'',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,4,QUERY,,'SELECT 1',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,5,QUERY,,'SET GLOBAL server_audit_events=\'CONNECT,QUERY,TABLE\'',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,6,QUERY,,'SELECT 1',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,7,QUERY,,'SET GLOBAL server_audit_logging=ON',0
20160502 10:34:50,ip-10-7-0-127,rdsadmin,localhost,10,8,QUERY,,'SELECT 1',0
(中略)
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,828,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,829,QUERY,,'select name from mysql.plugin',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,830,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,831,QUERY,,'SELECT count(*) from mysql.rds_history WHERE action = \'disable set master\' ORDER BY action_timestamp LIMIT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,832,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,833,QUERY,,'SELECT count(*) from mysql.rds_replication_status WHERE master_host IS NOT NULL and master_port IS NOT NULL ORDER BY action_timestamp LIMIT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,834,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,835,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,836,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,837,QUERY,,'select name from mysql.plugin',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,838,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,839,QUERY,,'SELECT count(*) from information_schema.TABLES WHERE TABLE_SCHEMA = \'mysql\' AND TABLE_NAME = \'rds_heartbeat2\'',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,840,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,841,QUERY,,'SELECT value FROM mysql.rds_heartbeat2',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,842,QUERY,,'SELECT 1',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,843,QUERY,,'select @@session.tx_read_only',0
20160502 11:00:00,ip-10-7-0-127,rdsadmin,localhost,10,844,QUERY,,'flush logs',0
(中略)
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,949,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,950,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,951,QUERY,,'SELECT count(*) from information_schema.TABLES WHERE TABLE_SCHEMA = \'mysql\' AND TABLE_NAME = \'rds_heartbeat2\'',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,952,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,953,QUERY,,'SELECT value FROM mysql.rds_heartbeat2',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,954,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,955,QUERY,,'SELECT count(*) from information_schema.TABLES WHERE TABLE_SCHEMA = \'mysql\' AND TABLE_NAME = \'rds_heartbeat2\'',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,956,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,957,QUERY,,'select @@session.tx_read_only',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,958,QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462187025005) ON DUPLICATE KEY UPDATE value = 1462187025005',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,959,QUERY,,'SELECT 1',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,960,QUERY,,'select @@session.tx_read_only',0
20160502 11:03:45,ip-10-7-0-127,rdsadmin,localhost,10,961,QUERY,,'COMMIT',0
(略)

つぎにrdsadminが何をしているのか探ってみましょう。ちょっとシェル芸をして、監査ログを集計してみます。

$ grep rdsadmin ./server_audit_2.log | cut -d',' -f7- | sort | uniq -c | sort -nr
1222 QUERY,,'SELECT 1',0
 260 QUERY,,'SELECT count(*) from information_schema.TABLES WHERE TABLE_SCHEMA = \'mysql\' AND TABLE_NAME = \'rds_heartbeat2\'',0
 248 QUERY,,'SELECT value FROM mysql.rds_heartbeat2',0
  62 QUERY,,'SELECT count(*) from mysql.rds_replication_status WHERE master_host IS NOT NULL and master_port IS NOT NULL ORDER BY action_timestamp LIMIT 1',0
  62 QUERY,,'SELECT count(*) from mysql.rds_history WHERE action = \'disable set master\' ORDER BY action_timestamp LIMIT 1',0
  50 QUERY,,'select @@session.tx_read_only',0
  28 QUERY,,'select name from mysql.plugin',0
  13 QUERY,,'flush logs',0
  13 QUERY,,'SELECT NAME, VALUE FROM mysql.rds_configuration',0
  12 QUERY,,'COMMIT',0
  12 DISCONNECT,,,0
  12 CONNECT,,,0
   2 QUERY,,'SET GLOBAL server_audit_file_path=\'/rdsdbdata/log/audit/\'',0
   1 QUERY,,'install plugin server_audit soname "server_audit.so"',0
   1 QUERY,,'SET GLOBAL server_audit_logging=ON',0
   1 QUERY,,'SET GLOBAL server_audit_events=\'CONNECT,QUERY,TABLE\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000016\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000015\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000014\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000013\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000012\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000011\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000010\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000009\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000008\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000007\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000006\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000005\'',0
   1 QUERY,,'PURGE BINARY LOGS TO \'mysql-bin-changelog.000004\'',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462188825006) ON DUPLICATE KEY UPDATE value = 1462188825006',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462188525005) ON DUPLICATE KEY UPDATE value = 1462188525005',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462188225005) ON DUPLICATE KEY UPDATE value = 1462188225005',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462187925005) ON DUPLICATE KEY UPDATE value = 1462187925005',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462187625005) ON DUPLICATE KEY UPDATE value = 1462187625005',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462187325005) ON DUPLICATE KEY UPDATE value = 1462187325005',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462187025005) ON DUPLICATE KEY UPDATE value = 1462187025005',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462186725005) ON DUPLICATE KEY UPDATE value = 1462186725005',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462186425004) ON DUPLICATE KEY UPDATE value = 1462186425004',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462186110005) ON DUPLICATE KEY UPDATE value = 1462186110005',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462185795004) ON DUPLICATE KEY UPDATE value = 1462185795004',0
   1 QUERY,,'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462185480102) ON DUPLICATE KEY UPDATE value = 1462185480102',0

内容を確認すると、5分毎、1分毎、15秒毎にrdsadminが処理を行っていました。

5分毎の処理

以下のようにmysql.rds_heartbeat2に対するINSERT、バイナリログの削除、プラグインの確認を行っています。

  • INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1462185480102) ON DUPLICATE KEY UPDATE value = 1462185480102
  • PURGE BINARY LOGS TO 'mysql-bin-changelog.000005'
  • select name from mysql.plugin

mysql.rds_heartbeat2に入力している情報は、UNIX時間をミリ秒にしているデータのようです。このデータを元にRead Replicaとのレプリケーション遅延(ReplicaLag)を計測しているのかもしれません。
バイナリログの削除が5分毎なのは、Point In Time Recoveryが5分前まで可能であるためだと思われます。Read Replicaがあり、レプリケーションを止めている時には挙動が変わると思われます。

1分毎の処理

以下のように、mysql.rds_historymysql.rds_replication_statusを参照しています。

  • SELECT count(*) from mysql.rds_history WHERE action = 'disable set master' ORDER BY action_timestamp LIMIT 1
  • SELECT count(*) from mysql.rds_replication_status WHERE master_host IS NOT NULL and master_port IS NOT NULL ORDER BY action_timestamp LIMIT 1

mysql.rds_historymysql.rds_replication_statusの内容は、以下の通りになっていました。テーブルの項目や内容から類推すると対象のインスタンスがMasterかRead Replicaかを判定しているようです。

mysql> SELECT * from mysql.rds_history;
+---------------------+--------------------+-------------------+---------------+-------------+-------------+--------------+-----------------+----------------+------------+
| action_timestamp    | called_by_user     | action            | mysql_version | master_host | master_port | master_user  | master_log_file | master_log_pos | master_ssl |
+---------------------+--------------------+-------------------+---------------+-------------+-------------+--------------+-----------------+----------------+------------+
| 2016-05-02 10:28:01 | rdsadmin@localhost | enable set master | 5.7.10-log    | NULL        |        NULL | rdsrepladmin | NULL            | NULL           |       NULL |
+---------------------+--------------------+-------------------+---------------+-------------+-------------+--------------+-----------------+----------------+------------+
1 row in set (0.00 sec)

mysql> SELECT * from mysql.rds_replication_status;
+---------------------+--------------------+-------------------+---------------+-------------+-------------+
| action_timestamp    | called_by_user     | action            | mysql_version | master_host | master_port |
+---------------------+--------------------+-------------------+---------------+-------------+-------------+
| 2016-05-02 10:28:00 | rdsadmin@localhost | enable set master | 5.7.11-log    | NULL        |        NULL |
+---------------------+--------------------+-------------------+---------------+-------------+-------------+
1 row in set (0.00 sec)

15秒毎の処理

以下のように、mysql.rds_heartbeat2の有無と値を確認しています。5分毎挿入しているUNIX時間を確認しているようです。

  • SELECT count(*) from information_schema.TABLES WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'rds_heartbeat2'
  • SELECT value FROM mysql.rds_heartbeat2

さいごに

MySQLやMariaDB これらと同様にMySQLベースであるAuroraでも同様にDB Audit Pluginが使用可能になる事を期待してしまいます。そして、今後PostgreSQLでのpg_auditサポートや、SQL ServerでのSQL Server Auditサポートがされれば全てのDBエンジンで監査ログの出力が可能になります。当然AWSとしても現在監査ログが未サポート/一部のみサポートしているDBエンジンについても監査ログの対応を進めていると思われます。
そして、監査ログを有効に活かすためには監査ログの運用方法を決める必要があります。監査ログを保存している事が重要であることもありますが、定期的な確認も重要ですので上手い運用環境を構築する必要が有ることも忘れないで下さい。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.